//
//  NSArray+UtilsExtras.m
//  EVTUtils
//
//  Created by xeon well on 3/7/12.
//  Copyright (c) 2012 eightcolor, Inc. All rights reserved.
//

#import "NSArray+UtilsExtras.h"

@implementation NSArray (UtilsExtras)
//安全获取数组第一个元素
- (id)firstObject {
    return self.count > 0 ? [self objectAtIndex:0] : nil;
}

//安全获取数组index元素
- (id)safeGetObjectAtIndex:(NSUInteger)index {
    if (index >= self.count) return nil;
    return [self objectAtIndex:index];
}

/**
 指定两端索引，返回一个新的子数组，会判断传入参数的合理性
 @param fromIndex 起始点
 @param toIndex 结束点
 */
- (NSArray *)subarrayFromIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex {
    if (fromIndex > toIndex) return nil;
    NSUInteger count = self.count;
    if (fromIndex >= count) return nil;
    if (toIndex >= count)
        toIndex = count - 1;
    return [self subarrayWithRange:NSMakeRange(fromIndex, toIndex - fromIndex + 1)];
}

/**
 将传入的参数合并到数组，如果传入的是一个数组，将展开一次。该方法来自js的array.concat方法, 注意需要以nil结尾
 @param obj 传入要合并的对象
 */
- (NSArray *)concatWithObjects:(id)obj, ... NS_REQUIRES_NIL_TERMINATION {
    if (!obj) return self;

    NSMutableArray *resultArray = [NSMutableArray arrayWithArray:self];

    va_list valist;
    va_start(valist, obj);

    id paramObj = obj;
    do {
        if ([paramObj isKindOfClass:[NSArray class]])
            [resultArray addObjectsFromArray:paramObj];
        else
            [resultArray addObject:paramObj];
    } while ((paramObj = va_arg(valist, id)) != nil);

    va_end(valist);
    return resultArray;
}


/**
 将传入的数组合并到数组，如果数组的子元素是一个数组，将展开一次。
 @param concatArray 传入要合并的数组
 @return 合并后的数组
 */
- (NSArray *)concatWithArray:(NSArray *)concatArray {
    if (!concatArray) return self;
    NSMutableArray *resultArray = [NSMutableArray arrayWithArray:self];
    for (id obj in concatArray) {
        if ([obj isKindOfClass:[NSArray class]])
            [resultArray addObjectsFromArray:obj];
        else
            [resultArray addObject:obj];
    }
    return resultArray;
}


#pragma mark - 数组转json数组
/**
 *  数组转json
 *  @param array 数组
 *  @return 返回json字符串
 */
- (NSString *)arrayTurnJson:(NSArray *)array {
    NSData* jsonData =[NSJSONSerialization dataWithJSONObject:array options:0 error:nil];
    NSString *jsonStr=[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    return jsonStr;
}

@end

@implementation NSMutableArray (PDUtilsExtras)
//弹出栈顶的元素并返回该元素
- (id)pop {
    if (self.count) {
        id obj = [self objectAtIndex:self.count - 1];
        [self removeLastObject];
        return obj;
    }
    return nil;
}

//弹出栈顶的元素并返回该元素
- (id)shift {
    if (self.count) {
        id obj = [self objectAtIndex:0];
        [self removeObjectAtIndex:0];
        return obj;
    }
    return nil;
}

//安全添加对象
- (void)safeAddObject:(id)anObject {
    if (anObject)
        [self addObject:anObject];
}

/**
 将数组中指定位置的元素移动到新的位置
 @param fromIndex 要挪动的元素索引
 @param toIndex 元素新位置索引
 */
- (void)moveObjectFromIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex {
    if (fromIndex == toIndex) 
        return;
    
    NSUInteger count = self.count;
    if (fromIndex >= count || toIndex >= count)
        return;
    
    id obj = [self objectAtIndex:fromIndex];
    [self removeObjectAtIndex:fromIndex];
    [self insertObject:obj atIndex:toIndex];
}

@end
